#ifndef __ZHONG_FRIEND_APPLY__
#define __ZHONG_FRIEND_APPLY__
#include "Factory.hpp"
#include "friend_apply.hxx"
#include "friend_apply-odb.hxx"

namespace bite_im
{
    class FriendApplyTable
    {
    public:
        using ptr = std::shared_ptr<FriendApplyTable>;
        FriendApplyTable() {}
        FriendApplyTable(const DBPtr &db) : _db(db) {}

        // 新增申请事件
        bool insert(FriendApply &fa)
        {
            // 申请事件一般来说是单方面的
            try
            {
                // 获取事务对象，开启事务
                odb::transaction transaction(_db->begin());

                _db->persist(fa);
                // 提交事务
                transaction.commit();
            }
            catch (std::exception &e)
            {
                LOG_ERROR("新增好友关系申请事件[{}-{}]错误，原因[{}]", fa.user_id(), fa.peer_id(), e.what());
                return false;
            }
            return true;
        }

        // 删除好友申请事件
        // bool remove(const std::string &event_id);
        bool remove(const std::string &user_id, const std::string &peer_id)
        {
            try
            {
                // 获取事务对象，开启事务
                odb::transaction transaction(_db->begin());
                using query = odb::query<FriendApply>;

                _db->erase_query<FriendApply>(query::user_id == user_id && query::peer_id == peer_id);
                // 提交事务
                transaction.commit();
            }
            catch (std::exception &e)
            {
                LOG_ERROR("删除好友关系申请事件[{}-{}]错误，原因[{}]", user_id, peer_id, e.what());
                return false;
            }
            return true;
        }
        // 查询是否申请过好友关系--防止重复insert
        bool exist(const std::string &user_id, const std::string &peer_id)
        {
            using query = odb::query<FriendApply>;
            using result = odb::result<FriendApply>;
            result ret;
            bool flag = false;
            try
            {
                // 3.获取事务对象，开启事务
                odb::transaction transaction(_db->begin());

                ret = _db->query<FriendApply>(query::user_id == user_id && query::peer_id == peer_id);

                flag = (ret.empty() == false) ? true : false; // 需要用临时变量维护，ret对象提交事务后会失效
                // 4.提交事务
                transaction.commit();
            }
            catch (std::exception &e)
            {
                LOG_ERROR("查询申请[{}-{}]事件失败，原因[{}]", user_id, peer_id, e.what());
            }

            return flag;
        }
        // 获取某个用户的所有好友申请id
        std::vector<std::string> friendApplys(const std::string &user_id)
        {
            std::vector<std::string> friend_list;
            try
            {
                // 3.获取事务对象，开启事务
                odb::transaction transaction(_db->begin());
                using query = odb::query<FriendApply>;
                using result = odb::result<FriendApply>;
                // 查询当前的user_id是作为谁的好友申请关系的peer_id（找到申请人）
                result ret(_db->query<FriendApply>(query::peer_id == user_id));
                for (auto it = ret.begin(); it != ret.end(); ++it)
                {
                    // 获取申请人自己的id
                    // 然后将找到的这些peer_id的user_id插入，user_id表示的是peer自己
                    friend_list.push_back(it->user_id());
                }
                // 4.提交事务
                transaction.commit();
            }
            catch (std::exception &e)
            {
                LOG_ERROR("获取[{}]所有好友申请关系失败，原因[{}]", user_id, e.what());
            }
            return friend_list;
        }

    private:
        DBPtr _db;
    };

}
#endif